import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 周斌
 * Date: 2023-11-27
 * Time: 21:16
 */
public class MyArrayList implements Ilist{
    //定义一个未被初始化的数组elem
    public int[] elem;
    //定义一个记录该数组存了多少容量
    public int size;
    //将该容量设置为一个常量，为了到后面调构造方法的时候初始化数组的大小
    public static final int DEFAULT_CAPACITY = 5;
    //调用构造函数的时候初始化数组的大小，而size成员变量不需要初始化，因为一开始未被初始化，默认初始化为0.
    public MyArrayList() {
        this.elem = new int[DEFAULT_CAPACITY];
    }
    @Override
    //往最后位置插入数据
    public void add(int data) {
        //判断空间是否满了，如果满了就扩容2倍
        if(isFuul()) {
            elem = Arrays.copyOf(elem,2*elem.length);
            System.out.println("扩容成功");
        }
        elem[size] = data;
        size++;
    }
    @Override
    public boolean isFuul() {
        return size == elem.length;
    }
    //打印数组全部内容
    @Override
    public void display() {
        for (int i = 0; i < size; i++) {
            System.out.println(elem[i]);
        }
    }
    // 在 pos 位置新增元素
    @Override
    public void add(int pos, int data) {
        //判断pos是否合法
        checkPosOfAdd(pos);
        //判断是否需要扩容
        if(isFuul()) {
            elem = Arrays.copyOf(elem,2*elem.length);
        }
        //最后在pos位置插入新元素
        for(int i=size-1;i>=pos;i--) {
            elem[i+1] = elem[i];
        }
        elem[pos] = data;
        size++;
    }
    //判断pos是否合法的方法，在顺序表中插入数据的时候，插入的位置前面必须要有数据。
    private void checkPosOfAdd (int pos) {
        if(pos<0 || pos>size) {
            throw new PosException("pos的位置不合法:"+pos);
        }
    }
    // 判定是否包含某个元素
    //直接遍历数组然后一一和目标元素比较，有就返回true，没有就返回false。
    @Override
    public boolean contains(int toFind) {
        for(int i=0;i< elem.length;i++) {
            if(toFind == elem[i]) {
                return true;
            }
        }
        return false;
    }
    // 查找某个元素对应的位置
    //直接遍历数组然后一一和目标元素比较，有就返回对应的下标，没有就返回-1。
    @Override
    public int indexOf(int toFind) {
        for(int i=0;i< elem.length;i++) {
            if(toFind == elem[i]) {
                return i;
            }
        }
        return -1;
    }
    // 获取 pos 位置的元素 如果顺序表为空返回-1或者抛出异常，不为空返回pos位置的元素
    @Override
    public int get(int pos) {
        //判断pos位置是否合法
        checkPosOfGet(pos);
        //判断这个顺序表是否为空
        if(isEmpty()) {
            throw new EmptyException("顺序表为空");
        }
        return elem[pos];
    }
    //判断顺序表是否为空
    @Override
    public boolean isEmpty() {
        return size == 0;
    }
    //判断pos合不合法的方法
    private void checkPosOfGet (int pos) {
        if(pos<0 || pos>size) {
            throw new PosException("pos的位置不合法:"+pos);
        }
    }
    // 给 pos 位置的元素设为 value
    @Override
    public void set(int pos, int value) {
        //判断pos是否合法
        checkPosOfSet(pos);
        //判断顺序表是否为空
        if(isEmpty()) {
            throw new EmptyException("顺序表为空");
        }
        //修改pos位置的内容
        this.elem[pos] = value;
    }
    private void checkPosOfSet (int pos) {
        if (pos < 0 || pos > size) {
            throw new PosException("pos的位置不合法:" + pos);
        }
    }
    //删除元素 如果顺序表中为空，则删不了，之后我们先找到我们要删的这个数。
    @Override
    public void remove(int toRemove) {
        //判断顺序表中是否为空
        if(isEmpty()) {
            throw new EmptyException("顺序表为空");
        }
        //找到我们需要删的这个数
        int indexof = indexOf(toRemove);
        for(int i = indexof;i<size-1;i++) {
            elem[i] = elem[i+1];
        }
        size--;
    }
    // 获取顺序表长度 直接返回size
    @Override
    public int size() {
        return this.size;
    }
    // 清空顺序表
    @Override
    public void clear() {
         size = 0;
    }
}
